package com.gtw.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性
 * 优点:
 *      1.高层模块调用简单:树结构中所有节点都是Component,高层模块不必关注是单个对象还是整个组合结构,简化高层模块代码
 *      2.节点增加自由,非常容易扩展,符合开闭原则
 * 缺点:
 *      叶子和树枝直接使用的是实现类,与依赖倒置原则冲突
 *      此问题解决办法是将组合用到的方法全部放到抽象类中变为透明模式,如:add()、remove()、getChildren()
 *      这样不管叶子还是树枝都有相同的结构,通过判断getChildren()的返回值是叶子还是树枝
 *      如果处理不当会在运行时出现问题,不推荐此种方式
 * 使用场景:
 *      部分-整体的关系,如:文件夹、树形菜单,从整体能独立出部分模块或功能的场景
 * 注意:
 *      只要是树形结构就要考虑组合模式,体现整体和部分关系的时候,而且关系比较深,都应考虑此模式
 */
public class Composite extends Component{
    private List<Component> componentList = new ArrayList<Component>();

    //增加叶子结构或树枝结构
    public void add(Component component){
        this.componentList.add(component);
    }

    public void rmove(Component component){
        this.componentList.remove(component);
    }

    //获取分支下所有叶子和分支结构
    public List<Component> getChildren(){
        return this.componentList;
    }
}
